import click
import subprocess
import sys
import os

# 确保我们是在项目根目录（包含 app.py, worker.py 等的目录）下运行
# 这有助于子进程正确找到文件
CWD = os.path.dirname(os.path.abspath(__file__))

@click.group()
def cli():
    """
    Axiom Boot Demo 应用本地开发管理工具。
    
    一个方便的启动器，用于在本地开发环境中管理 API 服务和 Worker。
    """
    pass

@cli.command()
def dev():
    """
    启动 API 服务 (app.py)。
    
    这会直接运行 `python app.py`，启动 FastAPI 开发服务器。
    """
    click.secho("🚀 [MANAGER] 正在启动 API 服务...", fg="green")
    # 使用 sys.executable 确保我们用的是和 manage.py 相同的 Python 解释器
    # shell=False (默认) 更安全
    process = subprocess.Popen([sys.executable, "app.py"], cwd=CWD)
    try:
        # 等待进程结束。在本地开发中，我们会用 Ctrl+C 来终止它。
        process.wait()
    except KeyboardInterrupt:
        click.secho("\n🚫 [MANAGER] 收到 Ctrl+C，正在关闭 API 服务...", fg="yellow")
        process.terminate()
        process.wait()
        click.secho("✅ [MANAGER] API 服务已关闭。", fg="green")

@cli.command()
@click.option('--queue', default=None, help='要监听的特定队列名称。')
@click.option('--workers', default=1, help='要启动的 Worker 进程数量。')
def worker(queue: str | None, workers: int):
    """
    启动后台任务 Worker (worker.py)。
    
    这会调用 `python worker.py ...` 命令。
    """
    click.secho(f"🚀 [MANAGER] 正在启动 {workers} 个后台 Worker...", fg="cyan")
    command = [sys.executable, "worker.py", "--workers", str(workers)]
    if queue:
        command.extend(["--queue", queue])
    
    process = subprocess.Popen(command, cwd=CWD)
    try:
        process.wait()
    except KeyboardInterrupt:
        click.secho("\n🚫 [MANAGER] 收到 Ctrl+C，正在关闭 Worker...", fg="yellow")
        # worker.py 内部已经有更精细的信号处理逻辑，
        # 所以这里我们只需要发送终止信号，让它自行优雅关闭。
        process.terminate()
        process.wait()
        click.secho("✅ [MANAGER] Worker 已关闭。", fg="cyan")

if __name__ == "__main__":
    cli()
